package git.soulbgm.common.listener;

import com.dangdang.ddframe.job.executor.ShardingContexts;
import com.dangdang.ddframe.job.lite.api.listener.AbstractDistributeOnceElasticJobListener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 任务监听器
 * 实现分布式任务监听器
 * 如果任务有分片，分布式监听器会在总的任务开始前执行一次，结束时执行一次
 *
 * @author SoulBGM
 * @date 2020-09-14
 */
@Component("elasticJobListener")
@Slf4j
public class ElasticJobListener extends AbstractDistributeOnceElasticJobListener {

    private static final long STARTED_TIMEOUT_MILLISECONDS = 100;
    private static final long COMPLETED_TIMEOUT_MILLISECONDS = 100;

    public ElasticJobListener() {
        super(STARTED_TIMEOUT_MILLISECONDS, COMPLETED_TIMEOUT_MILLISECONDS);
    }

    /**
     * 开始执行任务之前的操作
     *
     * @param shardingContexts 分片上下文
     */
    @Override
    public void doBeforeJobExecutedAtLastStarted(ShardingContexts shardingContexts) {
        log.info("开始执行任务之前,任务编号:{},任务名称:{},分片总数:{},任务参数:{},分片项参数:{},作业事件采样计数{},当前的工作事件抽样计数:{}",
                shardingContexts.getTaskId(),
                shardingContexts.getJobName(),
                shardingContexts.getShardingTotalCount(),
                shardingContexts.getJobParameter(),
                shardingContexts.getShardingItemParameters(),
                shardingContexts.getJobEventSamplingCount(),
                shardingContexts.getCurrentJobEventSamplingCount());
    }

    /**
     * 完成任务之后的操作
     *
     * @param shardingContexts 分片上下文
     */
    @Override
    public void doAfterJobExecutedAtLastCompleted(ShardingContexts shardingContexts) {
        log.info("完成任务之后,任务编号:{},任务名称:{},分片总数:{},任务参数:{},分片项参数:{},作业事件采样计数{},当前的工作事件抽样计数:{}",
                shardingContexts.getTaskId(),
                shardingContexts.getJobName(),
                shardingContexts.getShardingTotalCount(),
                shardingContexts.getJobParameter(),
                shardingContexts.getShardingItemParameters(),
                shardingContexts.getJobEventSamplingCount(),
                shardingContexts.getCurrentJobEventSamplingCount());
    }
}
